// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * Impl hand rolled.
 */
goog.module('vmbootstrap.JavaScriptFunction$impl');


const $Util = goog.require('nativebootstrap.Util$impl');


/**
 * Provides class literal and Object methods implementations for
 * JsFunctions.
 */
class JavaScriptFunction {
  /**
   * Marks the provided class as implementing this interface.
   * @param {Function} classConstructor
   * @public
   */
  static $markImplementor(classConstructor) {
    /**
     * @public {boolean}
     */
    classConstructor.prototype.$implements__$$JavaScriptFunction = true;
  }

  /**
   * Returns whether the provided instance is of a class that implements this
   * interface.
   * @param {*} instance
   * @return {boolean}
   * @public
   */
  static $isInstance(instance) {
    return (typeof instance == 'function')
        // This is only needed for array assignability check.
        || (instance != null && !!instance.$implements__$$JavaScriptFunction);
  }
}

$Util.$setClassMetadataForInterface(JavaScriptFunction, '<native function>');


JavaScriptFunction.$markImplementor(
    /** @type {Function} */ (JavaScriptFunction));


/**
 * Exported class.
 */
exports = JavaScriptFunction;
